package com.common.utils;

public class ModelUtil {

    /**
     * Map转换为实体类,有"_"转换为驼峰参数
     * @param clazz
     * @param map
     * @param isConvert true解析Map中是下划线的参数，false解析Map中是驼峰参数
     * @return
     * @throws Exception
     */
//    public static Object mapToBean(Class<?> clazz, Map<String, Object> map, boolean isConvert) throws Exception {
//        BeanInfo beanInfo = Introspector.getBeanInfo(clazz); // 获取类属性
//        Object obj = clazz.newInstance();
//        // 给 JavaBean 对象的属性赋值
//        PropertyDescriptor[] propertyDescriptors =  beanInfo.getPropertyDescriptors();
//        for (int i = 0; i< propertyDescriptors.length; i++) {
//            PropertyDescriptor descriptor = propertyDescriptors[i];
//            String propertyName = descriptor.getName();
//            if(isConvert) {//如果是true则把驼峰转换为"_"
//                propertyName=underScoreName(propertyName);
//            }
//            if (map.containsKey(propertyName)) {
//                // 下面一句可以 try 起来，这样当一个属性赋值失败的时候就不会影响其他属性赋值。
//                Object value = map.get(propertyName);
//                if(StringUtils.isBlank(String.valueOf(value))) {//如果值为空，结束本次循环，执行下次循环
//                    continue;
//                }
//
//                if(isConvert) {//如果是true,取完值则把"_"转换为驼峰
//                    propertyName=camelCaseName(propertyName);
//                }
//                Field privateField = getPrivateField(propertyName, clazz);
//                if (privateField == null) {
//                }
//                privateField.setAccessible(true);
//                String type = privateField.getGenericType().toString();
//                if (type.equals("class java.lang.String")) {
//                    privateField.set(obj, value);
//                } else if (type.equals("class java.lang.Boolean")) {
//                    privateField.set(obj, Boolean.parseBoolean(String.valueOf(value)));
//                } else if (type.equals("class java.lang.Long")) {
//                    privateField.set(obj, Long.parseLong(String.valueOf(value)));
//                } else if (type.equals("class java.lang.Integer")) {
//                    privateField.set(obj, Integer.parseInt(String.valueOf(value)));
//                } else if (type.equals("class java.lang.Double")) {
//                    privateField.set(obj,Double.parseDouble(String.valueOf(value)));
//                } else if (type.equals("class java.lang.Float")) {
//                    privateField.set(obj,Float.parseFloat(String.valueOf(value)));
//                } else if (type.equals("class java.math.BigDecimal")){
//                    privateField.set(obj,new BigDecimal(String.valueOf(value)));
//                }else if (type.equals("class java.lang.Byte")){
//                    privateField.set(obj,new Byte(String.valueOf(value)));
//                }else if (type.equals("class java.util.Date")){
//                    String val=String.valueOf(value);
//                    if(val.length()==7) {
//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
//                        privateField.set(obj,sdf.parse(val));
//                    }else if(val.length()==10) {
//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//                        privateField.set(obj,sdf.parse(val));
//                    }else {
//                        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                        privateField.set(obj,sdf.parse(val));
//                    }
//                }//可继续追加类型
//            }
//        }
//        return obj;
//    }

    /**
     * 驼峰转换为下划线
     * @param camelCaseName
     * @return
     */
    public static String underScoreName(String camelCaseName) {
        StringBuilder result = new StringBuilder();
        if (camelCaseName != null && camelCaseName.length() > 0) {
            result.append(camelCaseName.substring(0, 1).toLowerCase());
            for (int i = 1; i < camelCaseName.length(); i++) {
                char ch = camelCaseName.charAt(i);
                if (Character.isUpperCase(ch)) {
                    result.append("_");
                    result.append(Character.toLowerCase(ch));
                } else {
                    result.append(ch);
                }
            }
        }
        return result.toString();
    }
}
